package com.github.rxyor.common.core.enums;

import com.github.rxyor.common.core.util.ReflectUtil;
import java.lang.reflect.Method;

/**
 *<p>
 *
 *</p>
 *
 * @author liuyang
 * @date 2019/10/4 周五 15:10:00
 * @since 1.0.0
 */
public interface KeyValue<K extends Comparable<K>> {

    /**
     * enum unique code
     * @return
     */
    K getCode();

    /**
     * enum code description
     * @return
     */
    String getDesc();

    /**
     * enum name
     * @return
     */
    String name();


    class Util {

        /**
         *根据枚举code获取枚举
         *
         * @author liuyang
         * @date 2019-08-27 周二 16:43:43
         * @param code code
         * @param t t
         * @return
         */
        public static <T extends KeyValue> T getEnumByCode(Comparable code, Class<T> t) {
            if (code == null || t == null) {
                return null;
            }
            Method method = ReflectUtil.getNonParameterMethod(t, "values");
            T[] enums = (T[]) ReflectUtil.invokeNonParameterStaticMethod(method);
            if (enums == null) {
                return null;
            }
            for (T e : enums) {
                if (code.compareTo(e.getCode()) == 0) {
                    return e;
                }
            }
            return null;
        }

        /**
         *根据枚举name获取枚举
         *
         * @author liuyang
         * @date 2019-08-27 周二 16:44:23
         * @param name name
         * @param t t
         * @return
         */
        public static <T extends KeyValue> T getEnumByName(String name, Class<T> t) {
            if (name == null || t == null) {
                return null;
            }
            Method method = ReflectUtil.getNonParameterMethod(t, "values");
            T[] enums = (T[]) ReflectUtil.invokeNonParameterStaticMethod(method);
            if (enums == null) {
                return null;
            }
            for (T e : enums) {
                if (name.equals(e.name())) {
                    return e;
                }
            }
            return null;
        }

        /**
         *根据枚举code获取描述
         *
         * @author liuyang
         * @date 2019-08-27 周二 16:43:43
         * @param code code
         * @param t t
         * @return
         */
        public static <T extends KeyValue> String getDescByCode(Comparable code, Class<T> t) {
            KeyValue kv = getEnumByCode(code, t);
            if (kv != null) {
                return kv.getDesc();
            }
            return null;
        }
    }

}
